/**
 * Copyright &copy; 2013-2015 山东易科德软件有限公司   All rights reserved.
 */
package cn.net.ecode.modules.file.service;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.net.ecode.common.service.BaseService;
import cn.net.ecode.common.utils.SpringContextHolder;
import cn.net.ecode.modules.file.dao.FileEntityDao;
import cn.net.ecode.modules.file.dao.FileUserBizDao;
import cn.net.ecode.modules.file.dao.FileUserDao;
import cn.net.ecode.modules.file.entity.FileEntity;
import cn.net.ecode.modules.file.entity.FileUser;
import cn.net.ecode.modules.file.entity.FileUserBiz;

/**
 * 文件管理Service
 * @author jiangwenchao、ThinkGem
 * @version 2015-6-11
 */
@Service
@Transactional(readOnly = true)
public class FileService extends BaseService {

	@Autowired
	private FileEntityDao fileEntityDao;
	@Autowired
	private FileUserDao fileUserDao;
	@Autowired
	private FileUserBizDao fileUserBizDao;

	// 本身业务对象实例
	private static FileService fileService;

	/**
	 * 获取本身业务对象实例
	 */
	public static FileService getInstance() {
		if (fileService == null) {
			fileService = SpringContextHolder.getBean(FileService.class);
		}
		return fileService;
	}

	////////////////////////////// file //////////////////////////////
	
	/**
	 * 获取文件对象
	 * @param fileEntity
	 * @return
	 */
	public FileEntity getFile(FileEntity fileEntity) {
		return fileEntityDao.get(fileEntity);
	}

	/** 
	 * 上传文件列表查询，根据md5查询文件
	 * @param fileMd5
	 * @return FileEntity  
	 */
	public List<FileEntity> getFileList(FileEntity fileEntity) {
		List<FileEntity> list = fileEntityDao.findList(fileEntity);
		return list;
	}

	/**
	 * 保存文件
	 * @param fileEntity
	 */
	@Transactional(readOnly = false)
	public void saveFile(FileEntity fileEntity) {
		if (fileEntity.getIsNewRecord()) {
			fileEntity.preInsert();
			fileEntityDao.insert(fileEntity);
		} else {
			fileEntity.preUpdate();
			fileEntityDao.update(fileEntity);
		}
	}

	/**
	 * 删除文件
	 * @param fileEntity
	 */
	@Transactional(readOnly = false)
	public void deleteFile(FileEntity fileEntity) {
		fileEntity.preUpdate();
		fileEntityDao.delete(fileEntity);
	}

	////////////////////////////// file user //////////////////////////////
	
	/**
	 * 获取用户文件
	 * @param fileFile
	 * @return
	 */
	public FileUser getFileUser(String fileUserId) {
		return fileUserDao.get(new FileUser(fileUserId));
	}

	/** 
	 * 查询用户文件
	 * @param fileUser
	 */
	public List<FileUser> findFileUserList(FileUser fileUser) {
		return fileUserDao.findList(fileUser);
	}

	/** 
	 * 查询用户文件
	 * @param fileUser 文件主键：fileEntity.fileId
	 */
	public List<FileUser> findFileUserListByFileEntity(FileUser fileUser) {
		return fileUserDao.findListByFileEntity(fileUser);
	}

	/**
	 * 保存用户文件
	 * @param fileUser
	 */
	@Transactional(readOnly = false)
	public void saveFileUser(FileUser fileUser) {
		if (fileUser.getIsNewRecord()) {
			fileUser.preInsert();
			fileUserDao.insert(fileUser);
		} else {
			fileUser.preUpdate();
			fileUserDao.update(fileUser);
		}
	}

	/**
	 * 删除用户文件
	 * @param fileUser
	 */
	@Transactional(readOnly = false)
	public void deleteFileUser(FileUser fileUser) {
		fileUser.preUpdate();
		fileUserDao.delete(fileUser);
	}

	////////////////////////////// file user biz //////////////////////////////
	
	/** 
	 * 根据文件ID查询关联业务
	 * @param fileEntity 文件主键：fileId
	 */
	public List<FileUserBiz> findFileUserBizListByFileEntity(FileEntity fileEntity) {
		return fileUserBizDao.findListByFileEntity(fileEntity);
	}

	/** 
	 * 根据业务key查询附件
	 * @param fileUserBiz 业务分类：bizCategory、业务主键：bizKey
	 */
	public List<FileUserBiz> findListByBiz(FileUserBiz fileUserBiz) {
		return fileUserBizDao.findListByBiz(fileUserBiz);
	}

	/** 
	 * 保存上传附件业务关系
	 * @param fileUserBiz 文件业务与关联信息对象
	 * @example
	 * 		// 保存上传附件
	 * 		FileUserBiz file = new FileUserBiz("testData1", testData);
	 * 		FileService.getInstance().saveFileUserBiz(file);
	 */
	@Transactional(readOnly = false)
	public void saveFileUserBiz(FileUserBiz fileUserBiz) {
		String fileUserIds = fileUserBiz.getFileUserIds(); // 从前台传过来的参数（bizCategory的参数名称的值）
		if (StringUtils.isNotBlank(fileUserIds)) {
			String[] fileUserIdsz = fileUserIds.split(",");
			for (String fileUserId : fileUserIdsz) {
				fileUserBiz.setFileUser(new FileUser(fileUserId));
				//判断该上传记录是否有业务关系，没有则创建，有则不作为
				List<FileUserBiz> l = fileUserBizDao.findList(fileUserBiz);
				if (l == null || l.isEmpty() || l.size() <= 0) {
					fileUserBiz.preInsert();
					fileUserBizDao.insert(fileUserBiz);
				}
			}
		}
	}

	/** 
	 * 删除业务关系
	 * @param fileUserBiz
	 */
	@Transactional(readOnly = false)
	public int delFileUserBiz(FileUserBiz fileUserBiz) {
		fileUserBiz.preUpdate();
		return fileUserBizDao.delete(fileUserBiz);
	}

}